package thread.demo10.WaitAndNotify;

/**
 * 1. wait方法与notify方法必须要由同一个锁对象调用。因为：对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程。
 * 2. wait方法与notify方法是属于Object类的方法的。因为：锁对象可以是任意对象，而任意对象的所属类都是继 承了Object类的。
 * 3. wait方法与notify方法必须要在同步代码块或者是同步函数中使用。因为：必须要通过锁对象调用这2个方 法。
 */
public class Producer extends Thread{
    private Car car;

    public Producer(Car car) {
        this.car = car;
    }

    @Override
    public void run() {
        int count = 0;
        while(true){
            //使用同步代码块，保证只有一个线程进入临界区
            synchronized (car){
                if(car.flag == true){
                    try {
                        car.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if(count % 2 == 0){
                    car.name = "昂克赛拉";
                }else {
                    car.name = "GTR";
                }
                count++;
                System.out.println("生产商正在生产"+car.name);
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                car.flag = true;
                car.notify();
                System.out.println(car.name+"已经生产好了,消费者可以来提车了");
            }
        }

    }
}
